package com.example.hms.ulit;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class Tokenlnter implements HandlerInterceptor {
    // TOKEN过期时间设置为3小时
    private long refreshTime = 1000 * 60 * 60 * 3;

    // 在请求处理之前进行拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("拦截器拦截完成，默认旅行");
//        // 获取session对象
//        HttpSession session = request.getSession();
//        // 从session中获取用户名
//        String userName = (String) session.getAttribute("userName");
//        // 如果用户名为空或等于空字符串，表示用户未登录
//        if (userName == null || userName.equals("")) {
//            // 返回未登录的JSON信息
//            returnJson(response, JSONCreate("账户未登录"));
//            return false;
//        } else {
//            // 使用TokenUtil工具类检查TOKEN
//            Map<String, Object> map = TokenUtil.checkToken((String) session.getAttribute("token"));
//            // 如果TOKEN中的用户名与session中的用户名不一致，表示账户已过期
//            if (!map.get("userName").equals(userName)) {
//                returnJson(response, JSONCreate("账户已过期,请重新登录"));
//                return false;
//            } else {
//                // 如果当前时间戳减去TOKEN中的时间戳大于刷新时间，表示TOKEN过期
//                if (System.currentTimeMillis() - (Long) map.get("time") > refreshTime) {
//                    returnJson(response, JSONCreate("TOKEN过期,请重新登录"));
//                    return false;
//                } else {
//                    // TOKEN有效，继续处理请求
//                    return true;
//                }
//            }
//        }
        return true;
    }

    // 请求处理之后，但在视图渲染之前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        // 打印日志，表示业务代码执行完毕
//        System.out.println("业务代码执行完毕");
//
//        // 获取当前HTTP请求的Session对象
//        HttpSession session = request.getSession();
//
//        // 从Session中获取用户ID
//        String userId = ((Integer) session.getAttribute("userId")).toString();
//        // 从Session中获取用户名
//        String userName = (String) session.getAttribute("userName");
//        // 从Session中获取用户角色名
//        String roleName = (String) session.getAttribute("roleName");
//
//        // 获取当前系统时间戳
//        Long time = System.currentTimeMillis();
//
//        // 使用TokenUtil工具类生成token，并将token存入Session中
//        // TokenUtil.getToken方法可能需要userId, userName, roleName和时间戳来生成token
//        session.setAttribute("token", TokenUtil.getToken(userId, userName, roleName, time));
    }

    // 视图渲染之后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("视图渲染完毕");
    }

    // 返回JSON格式的响应
    private void returnJson(HttpServletResponse response, String result) throws Exception {
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        try {
            writer = response.getWriter();
            writer.print(result);
        } catch (IOException e) {
            // 处理IO异常
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }

    // 创建JSON格式的字符串
    private String JSONCreate(String message) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("{\"code\":-1,\"message\":\"");
        stringBuffer.append(message);
        stringBuffer.append("\"}");
        return stringBuffer.toString();
    }
}
